# Добро пожаловать
Радостно видеть, что вам интересен этот проект. Прежде всего стоит отметить, что мы всегда рады новым участникам и готовы помочь вам внести свой вклад в развитие. В этом файле вы найдёте информацию о том, как это сделать. Не стесняйтесь создавать новые [issues](https://github.com/0niel/university-app/issues) и [дискуссии](https://github.com/0niel/university-app/discussions), если у вас возникли вопросы или проблемы, даже если они кажутся вам незначительными.

## Участники
Всех участники проекта, которые внесли хоть какой-то вклад, отображаются в мобильном приложении в разделе "О приложении". Это происходит автоматически, как только ваш Pull Request будет принят и включён в релиз.

# Ваше участие
Каждый может внести свой вклад в развитие данного проекта. Мы с удовольствием рассмотрим ваш Pull Request, ознакомимся с вашими проблемами и вопросами.

Есть несколько принципов, которых нужно придерживаться:
1. Уважайте чужой труд. Если вы что-то откуда-то заимствуете, то обязательно указывайте источники.
2. Тщательно документируйте свой код.
3. Придерживайтесь стандартов оформления кода. Например, таких, как [Effective Dart: Style](https://dart.dev/guides/language/effective-dart/style)


# DCO 
Мы используем Developer Certificate of Origin (DCO) в качестве дополнительной защиты от недобросовестных участников. Это значит, что каждый коммит должен быть подписан автором, используя `git commit -s`.  Подробнее о DCO можно прочитать [здесь](https://developercertificate.org/). Узнать, как подписать свой коммит, можно [здесь](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits).


# Установка и конфигурация проекта
_Перед началом убедитесь, что у вас установлен JDK 17._

1. [Установите стабильную версию Flutter](https://docs.flutter.dev/get-started/install) для своей операционной системы, если вы этого ещё не сделали. Используйте `flutter doctor` для проверки установки и конфигурации Flutter.

Этот проект использует некотоыре пакеты, которые необходимо установить перед началом работы:
- [fvm](https://pub.dev/packages/fvm) для управления версиями Flutter.
- [melos](https://pub.dev/packages/melos) для управления подпакетами.

2. Установите fvm и melos:
```bash
dart pub global activate fvm
dart pub global activate melos
```

3. Используйте fvm в корневой директории проекта для установки версии Flutter, необходимой для работы над проектом:
```bash
fvm install
fvm flutter precache
```

4. Используйте melos в корневой директории проекта для установки зависимостей всех подпакетов:
```bash
melos bootstrap
```

Важно: Если ваш терминал не распознает команды `fvm` и `melos`, убедитесь, что Pub Cache находится в вашем `PATH`. Подробнее об этом можно прочитать [здесь](https://dart.dev/tools/pub/cmd/pub-global).

5. После установки всех зависимостей, вы можете запустить проект, выполнив команду:
```bash
fvm flutter run
```

### Дополнительные команды
- Используйте одну из этих команд для сборки проекта:
```bash
fvm flutter build apk
fvm flutter build ios
fvm flutter build appbundle
```

- Используйте melos для запуска команд во всех подпакетах:
```bash
melos run
```

- Если возникнут какие-либо проблемы при выполнении предыдущих действий, выполните приведенную ниже команду для анализа и устанения неполадок: -->
```bash
flutter doctor
```


## Генерация кода
Проект использует [build_runner](https://pub.dev/packages/build_runner) для генерации кода, например, сериализаторов JSON и маршалинга.

Используйте `melos run` для запуска команды `flutter pub run build_runner build` во всех подпакетах.


## Конфигурация Firebase Analytics
Пропустите этот шаг, если вы не планируете распространять свою собственную сборку приложения.

1. Зарегистрируйте приложение в [Firebase](https://console.firebase.google.com/).
2. Выполните шаги для генерации `firebase_options.dart` файла с помощью [FlutterFire CLI](https://firebase.flutter.dev/docs/cli).
3. Firebase Analytics для Android не поддерживает Dart-only конфигурацию. Как только ваше приложение для Android будет зарегистрировано в Firebase, загрузите файл конфигурации с консоли Firebase (файл называется `google-services.json`). Добавьте этот файл в каталог `android/app`.
4. Проект готов для использования с Firebase Analytics и Crashlytics.


## Переменные окружения
Приложение использует переменные среды времени компиляции для хранения конфиденциальных данных, таких как ключи API и токены. 

Эти переменные должны передаваться при запуске или сборке приложения с помощью аргумента `--dart-define` или установленной переменной окружения. Если вам нужно передать несколько пар ключ-значение, просто определите --dart-define несколько раз.

### Переменные приложения, используемые в проекте:
- `SENTRY_DSN` - DSN для отправки отчетов об ошибках в Sentry (необязательно).
- `LK_CLIENT_ID` - ID клиента для авторизации в Личном кабинете с помощью OAuth2.
- `LK_CLIENT_SECRET` - Секретный ключ клиента для авторизации в Личном кабинете с помощью OAuth2.

**Пример:**
```bash
fvm run --dart-define=SENTRY_DSN=YOUR_DSN --dart-define=LK_CLIENT_ID=YOUR_CLIENT_ID --dart-define=LK_CLIENT_SECRET=YOUR_CLIENT_SECRET
```

Если LK_CLIENT_ID и LK_CLIENT_SECRET не будут переданы, приложение будет работать в режиме "без авторизации", а пользователь не сможет войти в Личный кабинет.


# Запуск API сервера
В папке `api` расположен исходный код сервера, который используется для получения расписания, новостей, данных о сообществе. В качестве бэкенд-фреймворка используется [dart_frog](https://github.com/VeryGoodOpenSource/dart_frog). Сервер и мобильное приложение используют общую кодовую базу, а API-клиенты, с помощью которых приложение взаимодействует с сервером, определены в `./api/lib/src/client/api_client.dart`.

## Запуск сервера
1. Установите зависимости сервера:
```bash
cd api
dart pub get
```

2. Установите dart_frog_cli:
```bash
dart pub global activate dart_frog_cli
```

3. Запустите сервер:
```bash
dart_frog dev
```

Создание production-сборки сервера:
```bash
dart_frog build
```

Используйте `ApiClient.localhost()` для взаимодействия с сервером во время разработки https://github.com/0niel/university-app/blob/eea141fc7ce7a5f26e1486822eaec0d2d2983059/lib/main.dart#L170.


# Соглашение о коммитах
Мы используем семантическое именование коммитов, чтобы упростить процесс релизов и автоматизировать генерацию changelog'ов. Придерживайтесь правил, определённых в [Conventional Commits](https://www.conventionalcommits.org/).
